www.gusucode.com > ICA工具箱(p码) - icalab > ICA工具箱(p码) - icalab\simbec.m
function [B,W,C_index]=simbec(x,e,w,alpha,MaxIter,whitening,stop); % SIMBEC Algorithm % (Simultaneous Blind signal Extraction using Cumulants). % (c) Sergio Cruces, Andrzej Cichocki, S-i. Amari. % E-mail: sergio@us.es % Version 2.0 Last update 27/12/2002. % Version: 1.0, 28/07/2001. % %====================================================== % % PURPOSE: Perform ICA using simultaneous extraction % of 'e' independent components that are present % in the given data. % % OUTPUT ARGUMENTS % B Unitary ICA transformation. % W Prewhitening transformation. % C_index Final value of the contrast function. % % MANDATORY INPUT ARGUMENTS % x Matrix with the data observations % with dimension (N.sources x Samples). % Each row corresponds to a different sensor. % % OPTIONAL INPUT ARGUMENTS % e Number of independent componentes to % extract simultaneously (default e=1). % w Vector with the weighting coefficients. % alpha Vector with the exponents for cumulants. % MaxIter Maximum number of iterations. % stop Sensivity parameter to stop the convergence. % %========================================================= % % Related Bibliography: % % [1] S. Cruces, A. Cichocki, S-i. Amari, "On a new blind % signal extraction algorithm: different criteria % and stability analysis", IEEE Signal Processing % Letters, vol. 9(8), pp. 233 - 236, Aug. 2002. % [2] S. Cruces, A. Cichocki, S-i. Amari, % "Criteria for the Simultaneous Blind Extraction of % Arbitrary Groups of Sources" in the 3rd international % conference on Independent Component Analysis and % Blind Signal Separation. SanDiego, California, USA, 2001. % [3] S. Cruces, A. Cichocki, S-i. Amari, % "The Minimum Entropy and Cumulant Based Contrast % Functions for Blind Source Extraction", in Lecture % Notes in Computer Science, Springer-Verlag. % IWANN'2001, vol. II, pp. 786--793, (ISBN: 3-540-42237-4) % % [4] S-i. Amari, "Natural Gradient Learning for over- and % under-complete bases in ICA", Neural Computation, % Vol. 11, pp. 1875-1883, 1999. % %========================================================= verboseKS = 1; [n,T]=size(x); if ~exist('e','var'), e=1;end; if ~exist('w','var'), w=[0 0 1 0 0 0];end; if ~exist('alpha','var'), alpha=[1 1 1 1 1 1];end; if ~exist('whitening','var'), whitening=1; end; if ~exist('MaxIter','var'), MaxIter=1000; end; if ~exist('stop','var'), stop=1e-5; end; reinic=2; eta0= 1; I=eye(e); % PREWHITENING x=x-mean(x')'*ones(1,T); if whitening, if verboseKS, fprintf('Prewhitening...') end Rxx=x*x'/T; [u,d,v]=svd(Rxx+eye(n)); d=diag(d)-1; n=max(find(d>1e-14)); W=(u(:,1:n)*diag(real(sqrt(1./d(1:n))))*u(:,1:n)'); if verboseKS, fprintf('Done.\n') end else W=eye(n,n); if verboseKS, disp('Prewhitening is skipped.') end end x=W*x; % Prewhiten the data. % Initialization. if e==1 B=rand(1,n);B=B/norm(B); else B=eye(e,n); end C11yx=zeros(e,n);C11yy=zeros(e);D2=zeros(e); C21yx=zeros(e,n);C12yy=zeros(e);D3=zeros(e); C31yx=zeros(e,n);C13yy=zeros(e);D4=zeros(e); C41yx=zeros(e,n);C14yy=zeros(e);D5=zeros(e); C51yx=zeros(e,n);C15yy=zeros(e);D6=zeros(e); if verboseKS, disp('Extraction...') disp('[Iteration, Trace(|Cumulant|), convergence]') end convergence=0;phi=0; it=0; while ~convergence it=it+1; % Outputs y=B*x; % Statistics. y_=conj(y); if w(2) C11yx=(x*y_.')'/T; C11yy=B*(C11yx)'; v2=real(diag(diag(C11yy))); D2=sign(v2)*diag(diag(abs(v2)).^(alpha(2)-1)); end if w(3) C21yx=(x*(y_.*y).')'/T; C12yy=B*(C21yx)'; v3=real(diag(diag(C12yy))); D3=sign(v3)*diag(diag(abs(v3)).^(alpha(3)-1)); end if w(4) C31yx=(x*(y_.*y.*y_).'-2*(x*y_.')*diag(mean((y.*y_).'))-... (x*y.')*diag(mean((y_.*y_).')))'/T; C13yy=B*(C31yx)'; v4=real(diag(diag(C13yy))); D4=sign(v4)*diag(diag(abs(v4)).^(alpha(4)-1)); end; if w(5) C41yx=(x*(y'.^4)-4*x*y'*diag(mean(y.'.^3))-... 6*x*(y'.^2)*diag(mean(y.'.^2)))'/T; C14yy=B*(C41yx)'; v5=real(diag(diag(C14yy))); D5=sign(v5)*diag(diag(abs(v5)).^(alpha(5)-1)); end if w(6) C51yx=(x*(y'.^5)-5*x*y'*diag(mean(y.'.^5))-... 10*x*(y'.^2)*diag(mean(y.'.^3))-... 10*x*(y'.^3)*diag(mean(y.'.^2))+... 30*x*y'*diag((mean(y.'.^2)).^2))'/T; C15yy=B*(C51yx)'; v6=real(diag(diag(C15yy))); D6=sign(v6)*diag(diag(abs(v6)).^(alpha(6)-1)); end % Learning step size. eta=eta0/(1+fix(it/50)/2); mu=eta/2/max(... w(2)*abs(diag(C11yy).^alpha(2))+... w(3)*abs(diag(C12yy).^alpha(3))+... w(4)*abs(diag(C13yy).^alpha(4))+... w(5)*abs(diag(C14yy).^alpha(5))+... w(6)*abs(diag(C15yy).^alpha(6))); % Gradient algorithm on the Stifel manifold. if 0 B=B+mu*(... w(2)*(D2*C11yx-C11yy*D2*B)+... w(3)*(D3*C21yx-C12yy*D3*B)+... w(4)*(D4*C31yx-C13yy*D4*B)+... w(5)*(D5*C41yx-C14yy*D5*B)+... w(6)*(D6*C51yx-C15yy*D6*B)); else SS=(... w(2)*(D2*C11yx-C11yy*D2*B)+... w(3)*(D3*C21yx-C12yy*D3*B)+... w(4)*(D4*C31yx-C13yy*D4*B)+... w(5)*(D5*C41yx-C14yy*D5*B)+... w(6)*(D6*C51yx-C15yy*D6*B)); %mu=1/2/max(diag(C13yy*D4)); %B=B+mu*SS; % Simbec original. SSS=SS*B'; SK=(SSS'-SSS)/2; mu=mu/2; % Simbec stabilized version for noise. B=inv(eye(e)+mu*SK/2)*(eye(e)-mu*SK/2)*B+mu*SS; end % Convergence? phi(1,it+1)=sum(... w(2)/(2*alpha(2))*abs(diag(C11yy).^alpha(2))+... w(3)/(3*alpha(3))*abs(diag(C12yy).^alpha(3))+... w(4)/(4*alpha(4))*abs(diag(C13yy).^alpha(4))+... w(5)/(5*alpha(5))*abs(diag(C14yy).^alpha(5))+... w(6)/(6*alpha(6))*abs(diag(C15yy).^alpha(6))); delta=(abs(phi(1,it+1)-phi(1,it)))/phi(1,it+1); convergence = (delta<stop) | (it==MaxIter); if (trace(B*B')>1e3)& (reinic>=0), B=rand(e,n);B=B/norm(B); if reinic==0 %| e>1, B=zeros(e,n); convergence=1; else reinic=reinic-1; end end; % Draw evolution. if 0 for i=1:e; subplot(e,1,i); plot(y(i,:),'.'); end drawnow; end if verboseKS, fprintf('%d Cum_Index: %6.3f Convergence: %6.5f\r', it,phi(1,it+1),delta); else fprintf('it = %d\n', it ); end %-------- Interrupt window --------------- % KS pause( 1/100 ); go_next_step = findobj( 'Tag', 'alg_is_run' ); if isempty(go_next_step) fprintf( '\nUser break.\n\n' ); break; end %-------- Interrupt window --------------- end; C_index=phi(1,it+1); if verboseKS, fprintf('End.'); fprintf(' \n'); end % Sort outputs according to their index [v,i]= sort(w(2)/(2*alpha(2))*abs(diag(C11yy).^alpha(2))+... w(3)/(3*alpha(3))*abs(diag(C12yy).^alpha(3))+... w(4)/(4*alpha(4))*abs(diag(C13yy).^alpha(4))+... w(5)/(5*alpha(5))*abs(diag(C14yy).^alpha(5))+... w(6)/(6*alpha(6))*abs(diag(C15yy).^alpha(6))); B=B(flipud(i),:);